package main

import "runtime"

//func Trace(name string) func() {
//	println("enter:", name)
//	return func() {
//		println("exit:", name)
//	}
//}

// 自动获取调用方法名
func Trace() func() {
	// 第一个返回值代表的是程序计数（pc）；第二个和第三个参数
	// 代表对应函数所在的源文件名以及所在行数，这里我们暂时不需要；最后一个参数代表是
	// 否能成功获取这些信息，如果获取失败，我们抛出 panic。
	pc, _, _, ok := runtime.Caller(1)
	if !ok {
		panic("not found caller")
	}
	funcForPC := runtime.FuncForPC(pc)
	name := funcForPC.Name()
	println("enter:", name)
	return func() {
		println("exit:", name)
	}
}

func m1() {
	defer Trace()()
	println("do m1 something")
	m2()
}

func m2() {
	defer Trace()()
	println("do m2 something")
}

func main() {
	m1()
}
